package controlador;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
import modelo.excepciones.ExcepcionDeTanque;
import modelo.servicios.InformacionBasica;
import org.apache.log4j.Logger;

/**
 * Clase que recibe las entradas de petróleo vía documentos XML y las incluye en el tanque.
 * @author Eduardo
 */
public class ServidorOT extends Thread {

    private static ServerSocket servidor = null;
    private static Logger logger = Logger.getLogger(ServidorOT.class);

    /**
     * Constructor de la clase. Inicia la ejecución del hilo
     */
    public ServidorOT() {
        start();
    }

    @Override
    public void run() {
        InformacionBasica ib = (new Informacion()).obtenerInformacionBasica();

        try {
            servidor = new ServerSocket(ib.getPuertoSSOT());
        } catch (IOException ex) {
            System.err.println(ex);
        }

        if (ib.getPuertoSSOT() > 1024) {
            while(true) {
                try {
                    int idEmisor = 0;

                    if (ib.getIdTanque() == 1)
                        idEmisor = 3;

                    if (ib.getIdTanque() == 2)
                        idEmisor = 1;

                    if (ib.getIdTanque() == 3)
                        idEmisor = 2;

                    logger.info("Esperando entradas de petroleo desde otro tanque por el puerto "
                            + ib.getPuertoSSOT());

                    System.out.println("Esperando entradas de petróleo desde otro tanque por el "
                            + "puerto " + ib.getPuertoSSOT());

                    /**
                     * Recibiendo entradas de petróleo
                     */
                    Socket sock = servidor.accept();

                    /**
                     * Abriendo flujo de entrada de datos
                     */
                    ObjectInputStream input = new ObjectInputStream(sock.getInputStream());
                    String xmlRecibido = (String)input.readObject();

                    String mensaje = "";
                    if (idEmisor != 0)
                        mensaje = "Recibiendo el documento XML: \n\'" + xmlRecibido + "\'\nen el "
                                + "tanque " + ib.getIdTanque() + " desde el tanque " + idEmisor;
                    
                    logger.info(mensaje);
                    System.out.println(mensaje);

                    /**
                     * Instanciando un objeto de la clase que contiene los métodos necesarios para
                     * controlar los niveles de petróleo del tanque
                     */
                    Informacion i = new Informacion();
                    i.almacenarXMLrecibido(xmlRecibido);
                    
                    /**
                     * Cerrando el flujo de entrada de datos
                     */
                    input.close();

                    /**
                     * Cerrando el socket
                     */
                    System.out.println("Cerrando el socket");
                    sock.close();
                } catch (ExcepcionDeTanque ex) {
                    logger.error("Ocurrio un error en la informacion del documento XML");
                    System.out.println("Ocurrió un error en la información del documento XML");
                } catch (IOException ex) {
                    logger.error("Ocurrio un error de entrada/salida de datos");
                    System.out.println("Ocurrió un error de entrada/salida de datos");
                } catch (ClassNotFoundException ex) {
                    logger.error("Ocurrio un error de Clase No Encontrada");
                    System.out.println("Ocurrió un error de Clase No Encontrada");
                }
            }
        }
    }
}
